#ifndef __CSV_PARSE_H
#define __CSV_PARSE_H

/**
 * @struct ObjectInfo
 * @brief 存储物体识别信息的结构体
 */
typedef struct {
    int label;           /**< 唯一标识物体的整数值，从0开始连续递增 */
    char english[64];    /**< 物体的英文名称，最多63个字符 */
    char chinese[128];   /**< 物体的中文名称，最多127个字符，支持UTF-8编码 */
    char category[32];   /**< 物体所属分类，如"食品"、"动物"等，最多31个字符 */
} ObjectInfo;

/**
 * @brief 解析CSV文件并加载物体信息
 * @param filename 要解析的CSV文件路径
 * @param count 输出参数，返回加载的物体信息数量
 * @return 成功返回物体信息数组指针，失败返回NULL
 * @note 
 * - CSV文件格式要求：label值,英文名称,中文名称,分类
 * - 文件必须以UTF-8编码保存
 * - 函数内部会自动按label值排序，以便支持二分查找
 * @warning 
 * - 返回的数组内存需通过freeObjects()释放
 * - 若文件不存在或格式错误，返回NULL并设置errno
 */
ObjectInfo* parseCsvFile(const char *filename, int *count);

/**
 * @brief 使用二分查找快速定位特定label的物体信息
 * @param objects 由parseCsvFile()返回的物体信息数组
 * @param count 数组中的元素数量
 * @param label 要查找的label值
 * @return 成功返回对应ObjectInfo指针，未找到返回NULL
 * @note 
 * - 数组必须已按label值升序排序（parseCsvFile()会自动排序）
 * - 时间复杂度为O(log n)，适用于频繁查询场景
 */
ObjectInfo* findObjectByLabel(ObjectInfo *objects, int count, int label);

/**
 * @brief 释放由parseCsvFile()分配的内存
 * @param objects 物体信息数组指针
 * @note 
 * - 调用后objects指针将失效
 * - 允许传入NULL（此时函数无操作）
 */
void freeObjects(ObjectInfo *objects);

#endif // The end of __CSV_PARSE_H